Termination w.r.t. Q of the following Term Rewriting System could be proven:

Q restricted rewrite system:
The TRS R consists of the following rules:

app(app(times, x), app(app(plus, y), app(s, z))) → app(app(plus, app(app(times, x), app(app(plus, y), app(app(times, app(s, z)), 0)))), app(app(times, x), app(s, z)))
app(app(times, x), 0) → 0
app(app(times, x), app(s, y)) → app(app(plus, app(app(times, x), y)), x)
app(app(plus, x), 0) → x
app(app(plus, x), app(s, y)) → app(s, app(app(plus, x), y))
app(app(map, f), nil) → nil
app(app(map, f), app(app(cons, x), xs)) → app(app(cons, app(f, x)), app(app(map, f), xs))
app(app(filter, f), nil) → nil
app(app(filter, f), app(app(cons, x), xs)) → app(app(app(app(filter2, app(f, x)), f), x), xs)
app(app(app(app(filter2, true), f), x), xs) → app(app(cons, x), app(app(filter, f), xs))
app(app(app(app(filter2, false), f), x), xs) → app(app(filter, f), xs)

Q is empty.


QTRS
  ↳ DependencyPairsProof

Q restricted rewrite system:
The TRS R consists of the following rules:

app(app(times, x), app(app(plus, y), app(s, z))) → app(app(plus, app(app(times, x), app(app(plus, y), app(app(times, app(s, z)), 0)))), app(app(times, x), app(s, z)))
app(app(times, x), 0) → 0
app(app(times, x), app(s, y)) → app(app(plus, app(app(times, x), y)), x)
app(app(plus, x), 0) → x
app(app(plus, x), app(s, y)) → app(s, app(app(plus, x), y))
app(app(map, f), nil) → nil
app(app(map, f), app(app(cons, x), xs)) → app(app(cons, app(f, x)), app(app(map, f), xs))
app(app(filter, f), nil) → nil
app(app(filter, f), app(app(cons, x), xs)) → app(app(app(app(filter2, app(f, x)), f), x), xs)
app(app(app(app(filter2, true), f), x), xs) → app(app(cons, x), app(app(filter, f), xs))
app(app(app(app(filter2, false), f), x), xs) → app(app(filter, f), xs)

Q is empty.

Using Dependency Pairs [1,15] we result in the following initial DP problem:
Q DP problem:
The TRS P consists of the following rules:

APP(app(filter, f), app(app(cons, x), xs)) → APP(app(filter2, app(f, x)), f)
APP(app(filter, f), app(app(cons, x), xs)) → APP(f, x)
APP(app(times, x), app(s, y)) → APP(plus, app(app(times, x), y))
APP(app(times, x), app(s, y)) → APP(app(plus, app(app(times, x), y)), x)
APP(app(filter, f), app(app(cons, x), xs)) → APP(app(app(app(filter2, app(f, x)), f), x), xs)
APP(app(map, f), app(app(cons, x), xs)) → APP(app(map, f), xs)
APP(app(plus, x), app(s, y)) → APP(app(plus, x), y)
APP(app(times, x), app(app(plus, y), app(s, z))) → APP(plus, app(app(times, x), app(app(plus, y), app(app(times, app(s, z)), 0))))
APP(app(times, x), app(app(plus, y), app(s, z))) → APP(app(plus, app(app(times, x), app(app(plus, y), app(app(times, app(s, z)), 0)))), app(app(times, x), app(s, z)))
APP(app(times, x), app(app(plus, y), app(s, z))) → APP(app(times, x), app(app(plus, y), app(app(times, app(s, z)), 0)))
APP(app(app(app(filter2, false), f), x), xs) → APP(app(filter, f), xs)
APP(app(app(app(filter2, true), f), x), xs) → APP(app(filter, f), xs)
APP(app(times, x), app(app(plus, y), app(s, z))) → APP(app(times, app(s, z)), 0)
APP(app(app(app(filter2, false), f), x), xs) → APP(filter, f)
APP(app(filter, f), app(app(cons, x), xs)) → APP(app(app(filter2, app(f, x)), f), x)
APP(app(times, x), app(app(plus, y), app(s, z))) → APP(app(plus, y), app(app(times, app(s, z)), 0))
APP(app(times, x), app(s, y)) → APP(app(times, x), y)
APP(app(map, f), app(app(cons, x), xs)) → APP(f, x)
APP(app(times, x), app(app(plus, y), app(s, z))) → APP(app(times, x), app(s, z))
APP(app(app(app(filter2, true), f), x), xs) → APP(cons, x)
APP(app(filter, f), app(app(cons, x), xs)) → APP(filter2, app(f, x))
APP(app(times, x), app(app(plus, y), app(s, z))) → APP(times, app(s, z))
APP(app(map, f), app(app(cons, x), xs)) → APP(cons, app(f, x))
APP(app(plus, x), app(s, y)) → APP(s, app(app(plus, x), y))
APP(app(app(app(filter2, true), f), x), xs) → APP(filter, f)
APP(app(app(app(filter2, true), f), x), xs) → APP(app(cons, x), app(app(filter, f), xs))
APP(app(map, f), app(app(cons, x), xs)) → APP(app(cons, app(f, x)), app(app(map, f), xs))

The TRS R consists of the following rules:

app(app(times, x), app(app(plus, y), app(s, z))) → app(app(plus, app(app(times, x), app(app(plus, y), app(app(times, app(s, z)), 0)))), app(app(times, x), app(s, z)))
app(app(times, x), 0) → 0
app(app(times, x), app(s, y)) → app(app(plus, app(app(times, x), y)), x)
app(app(plus, x), 0) → x
app(app(plus, x), app(s, y)) → app(s, app(app(plus, x), y))
app(app(map, f), nil) → nil
app(app(map, f), app(app(cons, x), xs)) → app(app(cons, app(f, x)), app(app(map, f), xs))
app(app(filter, f), nil) → nil
app(app(filter, f), app(app(cons, x), xs)) → app(app(app(app(filter2, app(f, x)), f), x), xs)
app(app(app(app(filter2, true), f), x), xs) → app(app(cons, x), app(app(filter, f), xs))
app(app(app(app(filter2, false), f), x), xs) → app(app(filter, f), xs)

Q is empty.
We have to consider all minimal (P,Q,R)-chains.

↳ QTRS
  ↳ DependencyPairsProof
QDP
      ↳ DependencyGraphProof

Q DP problem:
The TRS P consists of the following rules:

APP(app(filter, f), app(app(cons, x), xs)) → APP(app(filter2, app(f, x)), f)
APP(app(filter, f), app(app(cons, x), xs)) → APP(f, x)
APP(app(times, x), app(s, y)) → APP(plus, app(app(times, x), y))
APP(app(times, x), app(s, y)) → APP(app(plus, app(app(times, x), y)), x)
APP(app(filter, f), app(app(cons, x), xs)) → APP(app(app(app(filter2, app(f, x)), f), x), xs)
APP(app(map, f), app(app(cons, x), xs)) → APP(app(map, f), xs)
APP(app(plus, x), app(s, y)) → APP(app(plus, x), y)
APP(app(times, x), app(app(plus, y), app(s, z))) → APP(plus, app(app(times, x), app(app(plus, y), app(app(times, app(s, z)), 0))))
APP(app(times, x), app(app(plus, y), app(s, z))) → APP(app(plus, app(app(times, x), app(app(plus, y), app(app(times, app(s, z)), 0)))), app(app(times, x), app(s, z)))
APP(app(times, x), app(app(plus, y), app(s, z))) → APP(app(times, x), app(app(plus, y), app(app(times, app(s, z)), 0)))
APP(app(app(app(filter2, false), f), x), xs) → APP(app(filter, f), xs)
APP(app(app(app(filter2, true), f), x), xs) → APP(app(filter, f), xs)
APP(app(times, x), app(app(plus, y), app(s, z))) → APP(app(times, app(s, z)), 0)
APP(app(app(app(filter2, false), f), x), xs) → APP(filter, f)
APP(app(filter, f), app(app(cons, x), xs)) → APP(app(app(filter2, app(f, x)), f), x)
APP(app(times, x), app(app(plus, y), app(s, z))) → APP(app(plus, y), app(app(times, app(s, z)), 0))
APP(app(times, x), app(s, y)) → APP(app(times, x), y)
APP(app(map, f), app(app(cons, x), xs)) → APP(f, x)
APP(app(times, x), app(app(plus, y), app(s, z))) → APP(app(times, x), app(s, z))
APP(app(app(app(filter2, true), f), x), xs) → APP(cons, x)
APP(app(filter, f), app(app(cons, x), xs)) → APP(filter2, app(f, x))
APP(app(times, x), app(app(plus, y), app(s, z))) → APP(times, app(s, z))
APP(app(map, f), app(app(cons, x), xs)) → APP(cons, app(f, x))
APP(app(plus, x), app(s, y)) → APP(s, app(app(plus, x), y))
APP(app(app(app(filter2, true), f), x), xs) → APP(filter, f)
APP(app(app(app(filter2, true), f), x), xs) → APP(app(cons, x), app(app(filter, f), xs))
APP(app(map, f), app(app(cons, x), xs)) → APP(app(cons, app(f, x)), app(app(map, f), xs))

The TRS R consists of the following rules:

app(app(times, x), app(app(plus, y), app(s, z))) → app(app(plus, app(app(times, x), app(app(plus, y), app(app(times, app(s, z)), 0)))), app(app(times, x), app(s, z)))
app(app(times, x), 0) → 0
app(app(times, x), app(s, y)) → app(app(plus, app(app(times, x), y)), x)
app(app(plus, x), 0) → x
app(app(plus, x), app(s, y)) → app(s, app(app(plus, x), y))
app(app(map, f), nil) → nil
app(app(map, f), app(app(cons, x), xs)) → app(app(cons, app(f, x)), app(app(map, f), xs))
app(app(filter, f), nil) → nil
app(app(filter, f), app(app(cons, x), xs)) → app(app(app(app(filter2, app(f, x)), f), x), xs)
app(app(app(app(filter2, true), f), x), xs) → app(app(cons, x), app(app(filter, f), xs))
app(app(app(app(filter2, false), f), x), xs) → app(app(filter, f), xs)

Q is empty.
We have to consider all minimal (P,Q,R)-chains.
The approximation of the Dependency Graph [15,17,22] contains 3 SCCs with 17 less nodes.

↳ QTRS
  ↳ DependencyPairsProof
    ↳ QDP
      ↳ DependencyGraphProof
        ↳ AND
QDP
            ↳ UsableRulesProof
          ↳ QDP
          ↳ QDP

Q DP problem:
The TRS P consists of the following rules:

APP(app(plus, x), app(s, y)) → APP(app(plus, x), y)

The TRS R consists of the following rules:

app(app(times, x), app(app(plus, y), app(s, z))) → app(app(plus, app(app(times, x), app(app(plus, y), app(app(times, app(s, z)), 0)))), app(app(times, x), app(s, z)))
app(app(times, x), 0) → 0
app(app(times, x), app(s, y)) → app(app(plus, app(app(times, x), y)), x)
app(app(plus, x), 0) → x
app(app(plus, x), app(s, y)) → app(s, app(app(plus, x), y))
app(app(map, f), nil) → nil
app(app(map, f), app(app(cons, x), xs)) → app(app(cons, app(f, x)), app(app(map, f), xs))
app(app(filter, f), nil) → nil
app(app(filter, f), app(app(cons, x), xs)) → app(app(app(app(filter2, app(f, x)), f), x), xs)
app(app(app(app(filter2, true), f), x), xs) → app(app(cons, x), app(app(filter, f), xs))
app(app(app(app(filter2, false), f), x), xs) → app(app(filter, f), xs)

Q is empty.
We have to consider all minimal (P,Q,R)-chains.
We can use the usable rules and reduction pair processor [15] with the Ce-compatible extension of the polynomial order that maps every function symbol to the sum of its argument. Then, we can delete all non-usable rules [17] from R.

↳ QTRS
  ↳ DependencyPairsProof
    ↳ QDP
      ↳ DependencyGraphProof
        ↳ AND
          ↳ QDP
            ↳ UsableRulesProof
QDP
                ↳ ATransformationProof
          ↳ QDP
          ↳ QDP

Q DP problem:
The TRS P consists of the following rules:

APP(app(plus, x), app(s, y)) → APP(app(plus, x), y)

R is empty.
Q is empty.
We have to consider all minimal (P,Q,R)-chains.
We have applied the A-Transformation [17] to get from an applicative problem to a standard problem.

↳ QTRS
  ↳ DependencyPairsProof
    ↳ QDP
      ↳ DependencyGraphProof
        ↳ AND
          ↳ QDP
            ↳ UsableRulesProof
              ↳ QDP
                ↳ ATransformationProof
QDP
                    ↳ QDPSizeChangeProof
          ↳ QDP
          ↳ QDP

Q DP problem:
The TRS P consists of the following rules:

plus(x, s(y)) → plus(x, y)

R is empty.
Q is empty.
We have to consider all minimal (P,Q,R)-chains.
By using the subterm criterion [20] together with the size-change analysis [32] we have proven that there are no infinite chains for this DP problem.

From the DPs we obtained the following set of size-change graphs:



↳ QTRS
  ↳ DependencyPairsProof
    ↳ QDP
      ↳ DependencyGraphProof
        ↳ AND
          ↳ QDP
QDP
            ↳ UsableRulesProof
          ↳ QDP

Q DP problem:
The TRS P consists of the following rules:

APP(app(times, x), app(app(plus, y), app(s, z))) → APP(app(times, x), app(s, z))
APP(app(times, x), app(app(plus, y), app(s, z))) → APP(app(times, x), app(app(plus, y), app(app(times, app(s, z)), 0)))
APP(app(times, x), app(s, y)) → APP(app(times, x), y)

The TRS R consists of the following rules:

app(app(times, x), app(app(plus, y), app(s, z))) → app(app(plus, app(app(times, x), app(app(plus, y), app(app(times, app(s, z)), 0)))), app(app(times, x), app(s, z)))
app(app(times, x), 0) → 0
app(app(times, x), app(s, y)) → app(app(plus, app(app(times, x), y)), x)
app(app(plus, x), 0) → x
app(app(plus, x), app(s, y)) → app(s, app(app(plus, x), y))
app(app(map, f), nil) → nil
app(app(map, f), app(app(cons, x), xs)) → app(app(cons, app(f, x)), app(app(map, f), xs))
app(app(filter, f), nil) → nil
app(app(filter, f), app(app(cons, x), xs)) → app(app(app(app(filter2, app(f, x)), f), x), xs)
app(app(app(app(filter2, true), f), x), xs) → app(app(cons, x), app(app(filter, f), xs))
app(app(app(app(filter2, false), f), x), xs) → app(app(filter, f), xs)

Q is empty.
We have to consider all minimal (P,Q,R)-chains.
We can use the usable rules and reduction pair processor [15] with the Ce-compatible extension of the polynomial order that maps every function symbol to the sum of its argument. Then, we can delete all non-usable rules [17] from R.

↳ QTRS
  ↳ DependencyPairsProof
    ↳ QDP
      ↳ DependencyGraphProof
        ↳ AND
          ↳ QDP
          ↳ QDP
            ↳ UsableRulesProof
QDP
                ↳ UsableRulesReductionPairsProof
          ↳ QDP

Q DP problem:
The TRS P consists of the following rules:

APP(app(times, x), app(app(plus, y), app(s, z))) → APP(app(times, x), app(s, z))
APP(app(times, x), app(app(plus, y), app(s, z))) → APP(app(times, x), app(app(plus, y), app(app(times, app(s, z)), 0)))
APP(app(times, x), app(s, y)) → APP(app(times, x), y)

The TRS R consists of the following rules:

app(app(times, x), 0) → 0
app(app(plus, x), 0) → x
app(app(plus, x), app(s, y)) → app(s, app(app(plus, x), y))

Q is empty.
We have to consider all minimal (P,Q,R)-chains.
First, we A-transformed [17] the QDP-Problem. Then we obtain the following A-transformed DP problem.
The pairs P are:

times1(x, plus(y, s(z))) → times1(x, s(z))
times1(x, plus(y, s(z))) → times1(x, plus(y, times(s(z), 0)))
times1(x, s(y)) → times1(x, y)

and the Q and R are:
Q restricted rewrite system:
The TRS R consists of the following rules:

times(x, 0) → 0
plus(x, 0) → x
plus(x, s(y)) → s(plus(x, y))

Q is empty.

By using the usable rules with reduction pair processor [15] with a polynomial ordering [25], all dependency pairs and the corresponding usable rules [17] can be oriented non-strictly. All non-usable rules are removed, and those dependency pairs and usable rules that have been oriented strictly or contain non-usable symbols in their left-hand side are removed as well.

The following dependency pairs can be deleted:

times1(x, plus(y, s(z))) → times1(x, s(z))
The following rules are removed from R:

plus(x, 0) → x
Used ordering: POLO with Polynomial interpretation [25]:

POL(0) = 0   
POL(plus(x1, x2)) = 2 + x1 + 2·x2   
POL(s(x1)) = x1   
POL(times(x1, x2)) = x1 + 2·x2   
POL(times1(x1, x2)) = x1 + 2·x2   



↳ QTRS
  ↳ DependencyPairsProof
    ↳ QDP
      ↳ DependencyGraphProof
        ↳ AND
          ↳ QDP
          ↳ QDP
            ↳ UsableRulesProof
              ↳ QDP
                ↳ UsableRulesReductionPairsProof
QDP
                    ↳ RuleRemovalProof
          ↳ QDP

Q DP problem:
The TRS P consists of the following rules:

times1(x, s(y)) → times1(x, y)
times1(x, plus(y, s(z))) → times1(x, plus(y, times(s(z), 0)))

The TRS R consists of the following rules:

times(x, 0) → 0
plus(x, s(y)) → s(plus(x, y))

Q is empty.
We have to consider all minimal (P,Q,R)-chains.
By using the rule removal processor [15] with the following polynomial ordering [25], at least one Dependency Pair or term rewrite system rule of this QDP problem can be strictly oriented.
Strictly oriented dependency pairs:

times1(x, s(y)) → times1(x, y)


Used ordering: POLO with Polynomial interpretation [25]:

POL(0) = 0   
POL(plus(x1, x2)) = 1 + 2·x1 + x2   
POL(s(x1)) = 1 + x1   
POL(times(x1, x2)) = x1 + x2   
POL(times1(x1, x2)) = x1 + 2·x2   



↳ QTRS
  ↳ DependencyPairsProof
    ↳ QDP
      ↳ DependencyGraphProof
        ↳ AND
          ↳ QDP
          ↳ QDP
            ↳ UsableRulesProof
              ↳ QDP
                ↳ UsableRulesReductionPairsProof
                  ↳ QDP
                    ↳ RuleRemovalProof
QDP
                        ↳ RuleRemovalProof
          ↳ QDP

Q DP problem:
The TRS P consists of the following rules:

times1(x, plus(y, s(z))) → times1(x, plus(y, times(s(z), 0)))

The TRS R consists of the following rules:

times(x, 0) → 0
plus(x, s(y)) → s(plus(x, y))

Q is empty.
We have to consider all minimal (P,Q,R)-chains.
By using the rule removal processor [15] with the following polynomial ordering [25], at least one Dependency Pair or term rewrite system rule of this QDP problem can be strictly oriented.

Strictly oriented rules of the TRS R:

plus(x, s(y)) → s(plus(x, y))

Used ordering: POLO with Polynomial interpretation [25]:

POL(0) = 0   
POL(plus(x1, x2)) = 2·x1 + 2·x2   
POL(s(x1)) = 2 + x1   
POL(times(x1, x2)) = x1 + x2   
POL(times1(x1, x2)) = x1 + 2·x2   



↳ QTRS
  ↳ DependencyPairsProof
    ↳ QDP
      ↳ DependencyGraphProof
        ↳ AND
          ↳ QDP
          ↳ QDP
            ↳ UsableRulesProof
              ↳ QDP
                ↳ UsableRulesReductionPairsProof
                  ↳ QDP
                    ↳ RuleRemovalProof
                      ↳ QDP
                        ↳ RuleRemovalProof
QDP
                            ↳ DependencyGraphProof
          ↳ QDP

Q DP problem:
The TRS P consists of the following rules:

times1(x, plus(y, s(z))) → times1(x, plus(y, times(s(z), 0)))

The TRS R consists of the following rules:

times(x, 0) → 0

Q is empty.
We have to consider all minimal (P,Q,R)-chains.
The approximation of the Dependency Graph [15,17,22] contains 0 SCCs with 1 less node.

↳ QTRS
  ↳ DependencyPairsProof
    ↳ QDP
      ↳ DependencyGraphProof
        ↳ AND
          ↳ QDP
          ↳ QDP
QDP
            ↳ QDPSizeChangeProof

Q DP problem:
The TRS P consists of the following rules:

APP(app(filter, f), app(app(cons, x), xs)) → APP(f, x)
APP(app(app(app(filter2, false), f), x), xs) → APP(app(filter, f), xs)
APP(app(app(app(filter2, true), f), x), xs) → APP(app(filter, f), xs)
APP(app(filter, f), app(app(cons, x), xs)) → APP(app(app(app(filter2, app(f, x)), f), x), xs)
APP(app(map, f), app(app(cons, x), xs)) → APP(f, x)
APP(app(map, f), app(app(cons, x), xs)) → APP(app(map, f), xs)

The TRS R consists of the following rules:

app(app(times, x), app(app(plus, y), app(s, z))) → app(app(plus, app(app(times, x), app(app(plus, y), app(app(times, app(s, z)), 0)))), app(app(times, x), app(s, z)))
app(app(times, x), 0) → 0
app(app(times, x), app(s, y)) → app(app(plus, app(app(times, x), y)), x)
app(app(plus, x), 0) → x
app(app(plus, x), app(s, y)) → app(s, app(app(plus, x), y))
app(app(map, f), nil) → nil
app(app(map, f), app(app(cons, x), xs)) → app(app(cons, app(f, x)), app(app(map, f), xs))
app(app(filter, f), nil) → nil
app(app(filter, f), app(app(cons, x), xs)) → app(app(app(app(filter2, app(f, x)), f), x), xs)
app(app(app(app(filter2, true), f), x), xs) → app(app(cons, x), app(app(filter, f), xs))
app(app(app(app(filter2, false), f), x), xs) → app(app(filter, f), xs)

Q is empty.
We have to consider all minimal (P,Q,R)-chains.
By using the subterm criterion [20] together with the size-change analysis [32] we have proven that there are no infinite chains for this DP problem.

From the DPs we obtained the following set of size-change graphs: